package club.xiaojiawei.dp;

/**
 * @author 肖嘉威
 * @version 1.0
 * @date 6/6/22 11:26 PM
 * @question 309. 最佳买卖股票时机含冷冻期
 * @description 给定一个整数数组prices，其中第  prices[i] 表示第 i 天的股票价格 。
 * 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
 * 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
 * 注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
 */
public class MaxProfit309 {

    public static void main(String[] args) {
        MaxProfit309 test = new MaxProfit309();
        int result = test.maxProfit(new int[]{1, 2, 3, 0, 2});
        System.out.println(result);
    }

    /**
     * 官方-dp
     * @param prices
     * @return
     */
    public int maxProfit(int[] prices) {
        if (prices.length == 0) {
            return 0;
        }
        int n = prices.length;
        int buy = -prices[0];
        int freeze = 0;
        int sell = 0;
        for (int i = 1; i < n; ++i) {
//            非冰冻期买，所以用sell不用freeze，因为sell的第二天不处于冰冻期（sell那天没卖出第二天自然就不处于冰冻期了）
            int newBuy = Math.max(buy, sell - prices[i]);
//            当天卖出，第二天处于冰冻期
            int newFreeze = buy + prices[i];
//            当天不卖出，第二天不处于冰冻期，值要么是昨天卖的要么是之前就卖出的
            int newSell = Math.max(freeze, sell);
            buy = newBuy;
            freeze = newFreeze;
            sell = newSell;
        }
        return Math.max(freeze, sell);
    }
}
